Shader Variant(シェーダーバリアント)
多くの場合、固定されたシェーダーコードの断片の大部分を保持するだけでなく、わずかに異なるシェーダー「バリアント」を作成できるようにしておくと便利です。一般に「メガシェーダー」や「ウーバーシェーダー」と呼ばれ、ケースごとに異なるプリプロセッサーディレクティブでシェーダーコードを複数回コンパイルすることで達成されます。
Unity では、これは シェーダースニペットに #pragma multi_compile または #pragma shader_feature を追加することによって達成することができます。これも サーフェースシェーダー で動作します。
実行時には、適切なシェーダーバリアントは、マテリアルのキーワード (Material.EnableKeyword と DisableKeyword) またはグローバルシェーダーキーワード (Shader.EnableKeyword と DisableKeyword ) からピックアップされます。
/icons/hr.icon
code:shaderLab
#pragma multi_compile _ _USE_LERP_COLOR code:shaderLab
fixed4 frag(v2f i) : SV_Target
{
fixed4 t = tex2D(_MainTex, i.uv); //テクスチャの色を取得
fixed lum = Luminance(t.rgb); //テクスチャの色から輝度を計算
t = lerp(_LerpColorBlack, _LerpColorWhite, lum); //黒に入れる色、白に入れる色を輝度で補間する
return t;
}
これだけだと機能の切り替えがGUIから出来ないので、そちらの部分を作っていきます。
機能の切り替えは、マテリアルに対しShaderKeywordを設定することで切り替えることが出来ます。
Material.EnableKeywordや、Material.DisableKeywordを使用します。
あるいは、Material.shaderKeywordsを直接書き換える方法もとれます。
Inspectorを乗っ取らずにキーワードON、OFFだけを行うのであれば、プロパティに指定を加えるだけで簡単に設定が可能ですが、その場合は不必要なパラメータを隠すなどの凝った機能を付けることはできません。プロパティだけで行うには以下にようにします。
code:shaderLab
ON、OFFだけの切り替えは上の方法で良いですが、複数の機能を切り替える場合は以下のように書きます。この場合は、Aを選択すると、_USEMODE_AというキーワードがONとなり、Bの場合は、_USEMODE_BがONとなります。
code:shaderLab